前言:
海明码:
- 海明码一般只能纠1位错。
- 海明码默认进行偶校验(除非特殊说明使用奇校验)。
- 海明码是一串只由0和1组成的序列
奇偶校验
奇校验:一串由0和1组成的序列中1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。
偶校验:一串由0和1组成的序列中1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。例:
1111
奇校验就是11111
偶校验就是01111
1110
奇校验就是01110
偶校验就是11110
计算:
计算 1011 的海明码
一、计算校验位的个数
公式:2^r >= m + r + 1
(理解:在只出错一位的情况下,且出错只为0或1之间的出错,所以,2^r表示r位校验码最大可以校验的总位数,m+r意思为整个码中可能出错的次数,1为唯一正确的一次,所以2^r 要>= m + r + 1)
r:校验位的个数
m:信息位的个数 1011的信息位个数为:4
所以r最小为3,即校验位的个数为3
死记硬背:
二、分组
确定校验位在海明码中的位置
校验码只出现在第2的r次方位置上,这里用P表示
位置的二进制 | 111 | 110 | 101 | 100 | 011 | 010 | 001 |
位置 | L7 | L6 | L5 | L4 | L3 | L2 | L1 |
序列 | 1 | 0 | 1 | P3 | 1 | P2 | P1 |
分组:对P进行按进制位分组
先从P1开始,P1位置二进制中的最后一位是1(不看0),所以将所有位置二进制中最后一位为1的分为一组
即:
L1,L3,L5,L7
以此类推
L1,L3,L5,L7 将对应位置的序列值替换 P1,1,1,1
L2,L3,L6,L7 =====================》 P2,1,0,1
L4,L5,L6,L7 P3,1,0,1
校验码计算:
偶校验:一串由0和1组成的序列中1的个数如果为奇数则在前面加个1,使1的个数变成偶数,否则加0。
第一组中1的个数是3,为奇数,所以P1应为1,保证1的个数为偶数,同理P2=0,P3=0
将P带回序列得到偶校验码为 1010101
奇校验:一串由0和1组成的序列中1的个数如果为偶数则在前面加个1,使1的个数变成奇数,否则加0。
第一组中1的个数是3,为奇数,所以P1应为0,保证1的个数为奇数,同理P2=1,P3=1
将P带回序列得到奇校验码为 1011110
纠错:
假如传输过程中将1011传成了 1001
按照偶校验纠错:校验位P的值刚刚已经计算出P1=1,P2=0,P3=0
位置的二进制 | 111 | 110 | 101 | 100 | 011 | 010 | 001 |
位置 | L7 | L6 | L5 | L4 | L3 | L2 | L1 |
序列 | 1 | 0 | 0 | 0 | 1 | 0 | 1 |
按照上方的方法进行分组
根据纠错位E进行判断错误的位置
E1,L1,L3,L5,L7 将对应位置的序列值替换 E1,1,1,0,1
E2,L2,L3,L6,L7 =====================》 E2,0,1,0,1
E3,L4,L5,L6,L7 E3,0,0,0,1
根据偶校验得出E1=1,E2=0,E3=1,按照E3E2E1的顺序合并得到101,101为10进制的5,所以第5个位置出错,如表所示是正确的